Final Embedded Programming


Back

Arduino Coding



#include <WiFi.h>
#include <WebServer.h>
#include <ESP32Servo.h>

// Wi-Fi Access Point credentials
const char* ssid = "Mani UWD";
const char* password = "FORGE";

// Motor pins - Updated to avoid boot-strapping pins
const int M1_PIN = D0;  // GPIO2
const int M2_PIN = D1;  // GPIO3
const int M3_PIN = D2;  // GPIO4
const int M4_PIN = D3;  // GPIO5
const int M5_PIN = D4;  // GPIO6
const int M6_PIN = D5;  // GPIO7

Servo motor1, motor2, motor3, motor4, motor5, motor6;
WebServer server(80);

// HTML interface
const char MAIN_page[] PROGMEM = R"rawliteral(
<!DOCTYPE html><html><head><title>Manikandan Fablab</title>
<style>
body { font-family: cursive; text-align: center; margin-top: 40px; background: #fcfcfc; }
h1 { font-size: 50px; color: rgb(189, 45, 134); }
.joystick-container { display: flex; justify-content: center; gap: 110px; margin-top: 50px; }
.joystick { display: grid; grid-template-columns: 100px 100px 100px; grid-template-rows: 100px 100px 100px; gap: 10px; }
button {
  font-size: 18px; padding: 10px 20px; margin: 10px; border: none; border-radius: 8px;
  cursor: pointer; color: white; background-color: #e27a3e;
}
</style></head><body>
<h1>Manikandan Fablab</h1>
<div class="joystick-container">
  <div class="joystick">
    <div></div><button onclick="send('A')">F1</button><div></div>
    <button onclick="send('B')">L1</button><button onclick="send('C')">S1</button><button onclick="send('D')">R1</button>
    <div></div><button onclick="send('E')">B1</button><div></div>
  </div>
  <div class="joystick">
    <div></div><button onclick="send('X')">F2</button><div></div>
    <button onclick="send('Y')">L2</button><button onclick="send('Z')">S2</button><button onclick="send('O')">R2</button>
    <div></div><button onclick="send('P')">B2</button><div></div>
  </div>
</div>
<script>
function send(cmd) { fetch('/' + cmd).then(res => res.text()).then(console.log); }
</script></body></html>
)rawliteral";

// Stop all motors
void stopMotors() {
  motor1.writeMicroseconds(1000);
  motor2.writeMicroseconds(1000);
  motor3.writeMicroseconds(1000);
  motor4.writeMicroseconds(1000);
  motor5.writeMicroseconds(1000);
  motor6.writeMicroseconds(1000);
}

void setup() {
  Serial.begin(115200);

  motor1.attach(M1_PIN, 1000, 2000);
  motor2.attach(M2_PIN, 1000, 2000);
  motor3.attach(M3_PIN, 1000, 2000);
  motor4.attach(M4_PIN, 1000, 2000);
  motor5.attach(M5_PIN, 1000, 2000);
  motor6.attach(M6_PIN, 1000, 2000);
  delay(5000);  // Allow ESCs to initialize
  stopMotors();

  WiFi.softAP(ssid, password);
  Serial.print("WiFi started. Connect to: "); Serial.println(ssid);
  Serial.print("Visit: http://"); Serial.println(WiFi.softAPIP());

  server.on("/", []() { server.send_P(200, "text/html", MAIN_page); });

  server.on("/A", []() { motor1.writeMicroseconds(1800); motor2.writeMicroseconds(1800);  motor3.writeMicroseconds(1000); motor4.writeMicroseconds(1000);  motor5.writeMicroseconds(1000); motor6.writeMicroseconds(1000); server.send(200, "text/plain", "Forward 1"); });
  server.on("/B", []() { motor1.writeMicroseconds(1000); motor2.writeMicroseconds(1800);  motor3.writeMicroseconds(1000); motor4.writeMicroseconds(1000);  motor5.writeMicroseconds(1000); motor6.writeMicroseconds(1000); server.send(200, "text/plain", "Left 1"); });
  server.on("/E", []() { motor1.writeMicroseconds(1000); motor2.writeMicroseconds(1000);  motor3.writeMicroseconds(1000); motor4.writeMicroseconds(1000);  motor5.writeMicroseconds(1000); motor6.writeMicroseconds(1000); server.send(200, "text/plain", "Right 1"); });
  server.on("/D", []() { motor1.writeMicroseconds(1800); motor2.writeMicroseconds(1000);  motor3.writeMicroseconds(1000); motor4.writeMicroseconds(1000);  motor5.writeMicroseconds(1000); motor6.writeMicroseconds(1000); server.send(200, "text/plain", "Backward 1"); });
  server.on("/C", []() { stopMotors(); server.send(200, "text/plain", "Stop 1"); });

  server.on("/X", []() { motor1.writeMicroseconds(1000); motor2.writeMicroseconds(1000);  motor3.writeMicroseconds(1800); motor4.writeMicroseconds(1800);  motor5.writeMicroseconds(1000); motor6.writeMicroseconds(1000); server.send(200, "text/plain", "Forward 2"); });
  server.on("/Y", []() { motor1.writeMicroseconds(1000); motor2.writeMicroseconds(1000);  motor3.writeMicroseconds(1000); motor4.writeMicroseconds(1800);  motor5.writeMicroseconds(1000); motor6.writeMicroseconds(1800); server.send(200, "text/plain", "Left 2"); });
  server.on("/P", []() { motor1.writeMicroseconds(1000); motor2.writeMicroseconds(1000);  motor3.writeMicroseconds(1000); motor4.writeMicroseconds(1000);  motor5.writeMicroseconds(1800); motor6.writeMicroseconds(1800); server.send(200, "text/plain", "Right 2"); });
  server.on("/O", []() { motor1.writeMicroseconds(1000); motor2.writeMicroseconds(1000);  motor3.writeMicroseconds(1800); motor4.writeMicroseconds(1000);  motor5.writeMicroseconds(1800); motor6.writeMicroseconds(1000); server.send(200, "text/plain", "Backward 2"); });
  server.on("/Z", []() { stopMotors(); server.send(200, "text/plain", "Stop 2"); });

  server.begin();
}

void loop() {
  server.handleClient();
}


Code Explanation

  • WiFi.h enables Wi-Fi functionality on the ESP32S3 board.

  • WebServer.h allows the microcontroller to create a simple web server.

  • ESP32Servo.h used to control ESCs (Electronic Speed Controllers) like servo motors via PWM pins.

  • Sets the SSID and password for the board to act as a Wi-Fi hotspot.

  • Assigns digital pins to six motors D0–D5 (GPIO2–GPIO7)

  • Sets up a web server that listens on port 80 (HTTP default port).

  • HTML Web Interface contains 2 joystick layouts, each with buttons (F, L, S, R, B) representing directions.

  • Stops all motors by sending a neutral 1000µs signal (often used to arm or stop ESCs).

  • Attaches each ESC to the corresponding pin and sets the PWM signal range (1000–2000 µs).

  • When the root URL / is opened, the HTML page is served.